package br.com.triadworks.issuetracker.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.Transformers;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import br.com.triadworks.issuetracker.model.Comentario;
import br.com.triadworks.issuetracker.model.Issue;
@Transactional
@Repository
public class IssueDaoImpl implements IssueDao {
@PersistenceContext
private EntityManager entityManager;
@Override
public void salva(Issue issue) {
entityManager.persist(issue);
}
@Override
public void atualiza(Issue issue) {
entityManager.merge(issue);
}
@Override
public Issue carrega(Long id) {
Issue issue = entityManager.find(Issue.class, id);
return issue;
}
@Override
public void remove(Issue issue) {
entityManager.remove(issue);
}
@Override
public void comenta(Long idDaIssue, Comentario comentario) {
Issue issue = carrega(idDaIssue);
issue.adicionaComentario(comentario);
// atualiza(issue);
}
@Override
public void fecha(Long idDaIssue, Comentario comentario) {
Issue issue = carrega(idDaIssue);
issue.fecha(comentario);
}
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
@Override
public List<Issue> listaTudo() {
Session session = getSession();
Criteria criteria = session.createCriteria(Issue.class);
List issues = criteria.list();
return issues;
}
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
@Override
public List<Issue> getIssuesComComentarios() {
Session session = getSession();
Criteria criteria = session.createCriteria(Issue.class);
criteria.add(Restrictions.isNotEmpty("comentarios"));
criteria.setProjection(
Projections.projectionList()
.add(Property.forName("id"), "id")
.add(Property.forName("sumario"), "sumario")
.add(Property.forName("descricao"), "descricao")
.add(Property.forName("projeto"), "projeto")
);
criteria.setResultTransformer(Transformers.aliasToBean(Issue.class));
// criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return criteria.list();
// TypedQuery<Issue> query = entityManager
// .createQuery("select distinct(issue) from Issue issue " +
// "join fetch issue.comentarios " + // força EAGER via join
// "where issue.comentarios is not empty", Issue.class);
//
// List<Issue> issues = query.getResultList();
//
// return issues;
}
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
@Override
public List<Comentario> getComentarios(Long idDaIssue) {
TypedQuery<Comentario> query = entityManager
.createQuery("select comentario from Issue issue " +
"join issue.comentarios as comentario " +
"with comentario.criadaEm < CURRENT_DATE " +
"where issue.id = :id", Comentario.class);
query.setParameter("id", idDaIssue);
List<Comentario> comentarios = query.getResultList();
return comentarios;
}
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
@Override
public List<Issue> buscaPorSumario(String sumario) {
Session session = getSession();
Criteria criteria = session.createCriteria(Issue.class);
criteria.add(Restrictions.ilike("sumario", sumario, MatchMode.ANYWHERE));
criteria.setFetchMode("projeto", FetchMode.SELECT); // == FetchMode.LAZY
criteria.setFetchMode("reportadoPor", FetchMode.SELECT);
criteria.setFetchMode("assinadoPara", FetchMode.SELECT);
return criteria.list();
}
public Session getSession() {
Session session = ((Session) entityManager.getDelegate());
return session;
}
}